package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.OrgaoDAO;
import br.com.duosoftware.orcamento.daos.TipoAdministracaoDAO;
import br.com.duosoftware.orcamento.daos.UnidadeGestoraDAO;
import br.com.duosoftware.orcamento.daos.UnidadeOrcamentariaDAO;
import br.com.duosoftware.orcamento.entidades.Orgao;
import br.com.duosoftware.orcamento.entidades.TipoAdministracao;
import br.com.duosoftware.orcamento.entidades.UnidadeGestora;
import br.com.duosoftware.orcamento.entidades.UnidadeOrcamentaria;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Daniel
 * 
 */
@ManagedBean
@ViewScoped
public class UnidadeOrcamentariaBean implements Serializable {

    private UnidadeOrcamentaria unidadeOrcamentaria;
    private List<UnidadeOrcamentaria> unidadesOrcamentarias;
    private UnidadeOrcamentariaDAO unidadeOrcamentariaDAO;
    
    ///****Select Itens****
    
    private List<SelectItem> unidadesGestoras;
    private List<SelectItem> orgaos;
    private List<SelectItem> tiposAdministracao;
    
    public UnidadeOrcamentariaBean() {
        
        unidadeOrcamentariaDAO = new UnidadeOrcamentariaDAO();
        
    }

    public UnidadeOrcamentaria getUnidadeOrcamentaria() {
        return unidadeOrcamentaria;
    }

    public void setUnidadeOrcamentaria(UnidadeOrcamentaria unidadeOrcamentaria) {
        this.unidadeOrcamentaria = unidadeOrcamentaria;
    }

    public List<UnidadeOrcamentaria> getUnidadesOrcamentarias() {
        if(unidadesOrcamentarias == null){
            unidadesOrcamentarias = unidadeOrcamentariaDAO
                    .listarUnidadesOrcamentarias();
        }
        return unidadesOrcamentarias;
    }

    public void setUnidadesOrcamentarias(List<UnidadeOrcamentaria> unidadesOrcamentarias) {
        this.unidadesOrcamentarias = unidadesOrcamentarias;
    }
    
     /**
     * <b>Método que inicializa o UnidadeOrcamentaria a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        unidadeOrcamentaria = new UnidadeOrcamentaria();
        
    }

    /**
     * <b>Método que adiciona ou edita um UnidadeOrcamentarias</b><p>
     *
     * Após o término o método fecha o dialog de cadastro. <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {
        
        unidadeOrcamentariaDAO.salvarOuAtualizar(unidadeOrcamentaria);
        unidadeOrcamentaria = new UnidadeOrcamentaria();
        unidadesOrcamentarias = null;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgUnidadeOrcamentaria.hide()");
        requestContext.update("formUnidadesOrcamentarias:dtUnidadesOrcamentarias");

    }

    /**
     * <b>Método para iniciar o processo de edição de um UnidadeOrcamentarias.</b> <p>
     *
     * Ele verifica se há um UnidadeOrcamentarias selecionada para edição, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um UnidadeOrcamentarias selecionado o médoto abre o dialog para edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (unidadeOrcamentaria == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgUnidadeOrcamentaria.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um UnidadeOrcamentarias.</b> <p>
     *
     * Ele verifica se há um UnidadeOrcamentarias selecionado para exclusão, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um UnidadeOrcamentarias selecionado o médoto abre um p:dialog para confirma
     * ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (unidadeOrcamentaria == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirUnidadeOrcamentaria.show()");
        }

    }

    /**
     * <b>Método para excluir um UnidadeOrcamentarias.</b> <p>
     *
     * Ele verifica se a UnidadeOrcamentarias selecionado para exclusão está sendo utilizado
     * por alguma outra tabela do banco. Se estiver uma mensagem de aviso é dada
     * ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            unidadeOrcamentariaDAO.excluir(unidadeOrcamentaria);
            unidadeOrcamentaria = new UnidadeOrcamentaria();
            unidadesOrcamentarias = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirUnidadeOrcamentaria.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b> <p>
     *
     * O método instancia um novo objeto na variável UnidadeOrcamentarias para limpar as
     * infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        unidadeOrcamentaria = new UnidadeOrcamentaria();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgUnidadeOrcamentaria.hide()");
        requestContext.update("formUnidadesOrcamentarias:dtUnidadesOrcamentarias");

    }
    
    ///****Select Itens****
    public List<SelectItem> getUnidadesGestoras() {
        
        if(unidadesGestoras == null){
            
            unidadesGestoras = new LinkedList<SelectItem>();
            
            for(UnidadeGestora unidadeGestora : new UnidadeGestoraDAO()
                    .listarUnidadesGestoras()){
            
                unidadesGestoras.add(new SelectItem(unidadeGestora, unidadeGestora.toString()));
                
            }
            
        }
        
        return unidadesGestoras;
        
    }

    public List<SelectItem> getOrgaos() {
        
        orgaos = new LinkedList<SelectItem>();
        
        for(Orgao orgao : new OrgaoDAO().listarOrgaos()){
        
            orgaos.add(new SelectItem(orgao, orgao.toString()));
            
        }
        
        return orgaos;
        
    }

    public List<SelectItem> getTiposAdministracao() {
        
        if(tiposAdministracao == null){
        
            tiposAdministracao = new LinkedList<SelectItem>();
            
            for(TipoAdministracao tipoAdministracao : new TipoAdministracaoDAO()
                    .listarTipoAdministracao()){
            
                tiposAdministracao.add(new SelectItem(tipoAdministracao, tipoAdministracao.toString()));
                
            }
            
        }
        
        return tiposAdministracao;
        
    }
    
}
